package designmode.deepclone;

import java.io.*;

/**
 * 原型模式可以高效率的实现对象的创建,并不是初始化创建,而是动态的获取对象,当原始对象发生变化,克隆的对象也会随着变化
 * 但是当对已有的老代码进行修改时,每一个类都需要重写一个clone方法,就会出现很麻烦的情况
 * 什么是深度克隆和浅度克隆
 * 浅度克隆: 简单的复制对象的地址指针
 * 深度克隆: 会复制对象当前的所有基本数据类型的值和为引用对象申请空间
 */
public class Sheep  {
    String name;
    DeepCloneTarget deepCloneTarget;
    public Sheep() throws IOException {}

    //使用重写clone方法实现深克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object deep=null;
        deep=super.clone();
        Sheep deepSheep= (Sheep) deep;
        deepSheep.deepCloneTarget=(DeepCloneTarget) deepCloneTarget;
        return deepSheep;
    }
    //使用序列化方式实现深度克隆
    public Object deepC() throws IOException, ClassNotFoundException {
        //先写入内存
        ByteArrayOutputStream bo=new ByteArrayOutputStream();
        ObjectOutputStream oos=new ObjectOutputStream(bo);
        oos.writeObject(this);
        //从内存中读出一份
        ByteArrayInputStream in=new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oin=new ObjectInputStream(in);
        Sheep s = (Sheep) oin.readObject();
        return s;
    }

}
